﻿using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DMS.Core.Utilities
{
    public class FactoryHelper
    {
        static IUnityContainer container = null;
        static FactoryHelper()
        {
            container = new UnityContainer();
        }
        public static TInterface Instance<TInterface>(string name = null)
        {
            if (container.IsRegistered<TInterface>(name))
            {
                return container.Resolve<TInterface>(name);
            }
            return name == null ? default(TInterface) : Instance<TInterface>(null);
        }

        public static void RegisterType<TInterface, TAchiver>(string name = null)
            where TAchiver : TInterface
        {
            container.RegisterType<TInterface, TAchiver>(name);
        }

        ///// <summary>
        ///// 初始化所有接口的依赖
        ///// </summary>
        //public static void Init()
        //{
        //    new System.Threading.Thread(() =>
        //    {
        //        try
        //        {
        //            var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        //            List<Type> myAchivers = new List<Type>();
        //            List<Type> myInterfaces = new List<Type>();
        //            for (int i = 0; i < assemblies.Length; i++)
        //            {
        //                #region INIT ALL TYPES
        //                try
        //                {
        //                    var item = assemblies[i];
        //                    if (item.IsDynamic)
        //                        continue;
        //                    //var nm = item.GetName();
        //                    //if (nm.Name.StartsWith("System") || nm.Name.StartsWith("Microsoft"))
        //                    //    continue;
        //                    var types = item.GetTypes();
        //                    var interfaces = types.Where(x => x.IsInterface || x.IsAbstract);
        //                    var achivers = types.Where(x => !x.IsInterface && !x.IsAbstract && !x.IsSecurityTransparent);
        //                    myAchivers.AddRange(achivers);
        //                    myInterfaces.AddRange(interfaces);
        //                }
        //                catch (Exception exp)
        //                {
        //                    while (exp != null)
        //                    {
        //                        Console.WriteLine(exp.Message);
        //                        exp = exp.InnerException;
        //                    }
        //                }
        //                #endregion
        //            }
        //            for (int i = 0; i < myInterfaces.Count; i++)
        //            {
        //                var it = myInterfaces[i];
        //                int count = myAchivers.Count;
        //                List<Type> acs = new List<Type>();
        //                for (int j = 0; j < count; j++)
        //                {
        //                    var x = myAchivers[j];
        //                    try
        //                    {
        //                        if (it.IsAssignableFrom(x))
        //                        {
        //                            acs.Add(x);
        //                        }
        //                    }
        //                    catch (Exception)
        //                    {
        //                        count--;
        //                        j--;
        //                        myAchivers.Remove(x);
        //                    }
        //                }
        //                for (int j = 0; j < acs.Count; j++)
        //                {
        //                    container.RegisterType(it, acs[j]);
        //                }
        //            }
        //        }
        //        catch (Exception exp)
        //        {
        //            while (exp != null)
        //            {
        //                Console.WriteLine(exp.Message);
        //                exp = exp.InnerException;
        //            }
        //        }
        //    }).Start();
        //}
    }
}
